\cleardoublepage

\setcounter{page}{1}

\section{绪论}
\subsection{背景}

在通讯技术的发展下，网络的带宽和时延都达到了能够支撑起实时的云端虚拟化应用的程度。现在已经出现了许多实际产业中的云端虚拟化技术的运用，例如基于瘦客户机的云端系统 \cite{ambrose2002client}、以及目前各大云厂商在尝试推进的云游戏系统 \cite{shea2013cloud} 等。本章将介绍部分现有的技术框架在此场景中会遇到的问题，以及我们会使用哪些新技术来解决这一部分问题。

\par

本次的毕业设计将在对以上问题的探究的同时，对以下实际生产需求提供实际可操作的成果：局域网中运行的医学影像渲染系统，服务器需要在接收到用户请求后对模型数据进行渲染，并将结果即时发送回用户（用户规模大致为数十至上百）。在 Windows 服务器中的解决方案则为我们讨论和实现的重点。


\subsection{以 HTTP 为代表的部分应用层协议的缺陷}

目前许多的云端 Web 应用主要使用 HTTP 协议 \cite{10.17487/RFC2616} 来进行客户端与服务器之间的通信。但许多建立在 HTTP 协议上的框架在这种对时延和带宽要求较高的场合中不能充分发挥出较低层网络协议的效率。其主要原因是HTTP 协议在 服务器/客户端 模型中作为一种请求-响应的协议而存在，并未设计用以服务器和客户端之间的双工通信，连接的随用随关导致了 HTTP 连接对其底层的 TCP 连接利用的不充分。

\par

而为了解决基于 HTTP 协议的服务端向客户端的主动信息传输问题，主要有 Long Polling、Server Push \cite{RFC7540}、 Server-Sent Events \cite{Hickson:15:SE} 等方案。Long Polling 会占用一定的通信资源用以等待服务器传输数据；Server Push 虽然能够使服务器主动向客户端发送数据，但只有在客户端发起请求时才能收到，并不能起到推送的作用；Server-Sent Events 则事实上仅仅是从服务器到客户端的单工通信，并且只能传输 UTF-8 格式的数据，具有相当大的局限性。HTTP 协议的设计就决定了其并不适合作为应用云端化的载体，所以我们需要寻找或设计出适合云端 Web 应用的应用层协议。

\subsection{WebSocket 协议}

WebSocket 技术作为一个区别于 HTTP 的应用层全双工计算机通信协议，在 2011 年以 RFC 6455 被 IETF 标准化 \cite{fette2011websocket}。相较于 HTTP 协议，WebSocket 对于建立的 TCP 连接的利用更加充分，服务器和客户端在最开始的握手阶段需要使用 HTTP 协议以建立起 WebSocket 连接，之后两者之间的全双工通信全部基于握手阶段建立的 TCP 连接实现。WebSocket 能够使得客户端与服务器之间的通讯更为轻量，不需要每次都进行繁琐的连接建立过程，这在减少云端应用程序时延和增大其带宽的方面会起到很大的帮助。

\par

与此同时，考虑到 Web 应用的兼容性，WebSocket 协议使用了与 HTTP 协议相同的网络端口 ：WebSocket 协议使用 80 端口，WebSocket Secure 使用 443 端口。这种约定也可以减少 WebSocket 应用被防火墙拦截的可能性，同时也可以利用起部分对 HTTP 设计的网络基础设施，减少支持 WebSocket 所需的额外工作。目前已经有很多使用 WebSocket 的网页应用的实践，例如浏览器上的多人线上游戏 \cite{chen2011framework}, 基于 WebSocket 的即时通讯服务架构 \cite{zhangling2012real} 等。

\subsection{Windows 上的网络框架设计}

本文主要涉及到的内容为 Windows 平台上的 WebSocket 框架设计，所以也会接触到 Windows 操作系统提供的网络 API。 考虑到服务器的性能和计算机相关资源的损耗、以及服务器框架的结构，我们选择了 Windows 平台提供的异步 I/O 框架，I/O Completion Port （I/O 完成端口）\cite{iocp}。I/O 完成端口相较于 Windows 平台上的其它 I/O 模型，拥有着对 CPU 的利用更加高效、自动对 I/O 完成事件分配线程、拥有更简洁的异步 I/O 编程 API 等优势。同时 Windows 在 Vista 后提供了一套线程池 API，使得应用程序可以动态调控监听 I/O 完成端口事件的工作线程数量，尽量减少线程切换在服务器高负载时带来的额外 CPU 开销。

\par

在设计 Windows 上的网络框架时，也要注意一些在编码和 API 使用习惯与 Unix-like 系统的差异，保证设计出来的框架的可用性。

\subsection{同行工作}

目前已经有许多跨平台的 WebSocket 协议服务器框架实现，例如 WebSocket++ \cite{websocketpp}、Boost.Beast、µWebSocket、QtWebSocket、Simple-Web-Server \cite{eidheim2019simple} 等，这些实现已经在工业界获得了广泛运用，很大程度上取代了这些场景上原本使用 HTTP 协议的妥协。但这些框架或由于过度抽象导致难以上手、或依赖过多导致二进制文件体积膨胀。本项目将设计一款主打差异化、提供精简的编程接口、领域相关的 WebSocket 服务器框架。

\subsection{论文结构}

本文一共分为五个章节，其中：第一章绪论介绍本毕业设计提出的相关背景，第二章描述本项目的基本设计理念和总体设计思路，第三章介绍本项目中作为基础的高性能 Socket 服务器、客户端设计以及相关工具，第四章讲解在此基础上对 WebSocket 服务器和客户端的实现，第五章对编写的框架可用性以及正确性进行测试，第六章对全文进行总结并找出仍需改进的部分。



